/**
 * 时间工具函数
 * 提供一个简单的时间戳格式化方法：formatTimestamp
 *
 * 支持输入：
 * - 毫秒时间戳（13位）
 * - 秒时间戳（10位）
 * - 数字字符串（会尝试转换为数字）
 * - JavaScript Date 对象
 *
 * 默认格式：YYYY-MM-DD HH:mm:ss
 */

export type TimeInput = number | string | Date | null | undefined

function pad(num: number, targetLen = 2) {
  return String(num).padStart(targetLen, '0')
}

/**
 * 将时间戳或 Date 对象格式化为字符串
 * @param time 时间，可以是秒/毫秒时间戳（number 或数字字符串），或 Date 对象
 * @param format 格式，支持的 token: YYYY, MM, DD, HH, mm, ss, SSS
 * @returns 格式化后的时间字符串；当 time 为 null/undefined/非法时返回空字符串
 *
 * 示例：
 * formatTimestamp(1699190400, 'YYYY-MM-DD') // 处理秒级时间戳
 * formatTimestamp(1699190400000) // 默认 'YYYY-MM-DD HH:mm:ss'
 * formatTimestamp(new Date(), 'HH:mm:ss')
 */
export function formatTimestamp(
  time?: TimeInput,
  format = 'YYYY-MM-DD HH:mm:ss'
): string {
  if (time === null || time === undefined || time === '') return ''

  let date: Date | undefined

  if (time instanceof Date) {
    date = time
  } else {
    // 尝试把字符串转换为数字
    let t: number | undefined
    if (typeof time === 'string') {
      // 去掉空白
      const s = time.trim()
      // 如果是纯数字字符串，转为数字；否则尝试 new Date
      if (/^-?\d+$/.test(s)) {
        t = parseInt(s, 10)
      } else {
        const d = new Date(s)
        if (isNaN(d.getTime())) return ''
        date = d
        t = NaN
      }
    } else {
      // number
      t = time as number
    }

    if (!date) {
      if (typeof t !== 'number' || isNaN(t)) return ''
      // 10 位视为秒，13 位视为毫秒
      if (String(Math.abs(t)).length === 10) {
        t = t * 1000
      }
      date = new Date(t)
    }
  }

  if (!(date instanceof Date) || isNaN(date.getTime())) return ''

  const map: Record<string, string> = {
    YYYY: String(date.getFullYear()),
    MM: pad(date.getMonth() + 1),
    DD: pad(date.getDate()),
    HH: pad(date.getHours()),
    mm: pad(date.getMinutes()),
    ss: pad(date.getSeconds()),
    SSS: pad(date.getMilliseconds(), 3),
  }

  // 按 longest-first 替换（防止 YYYY 被替换后再替换 YY）
  const tokens = Object.keys(map).sort((a, b) => b.length - a.length)
  let out = format
  for (const token of tokens) {
    out = out.replace(new RegExp(token, 'g'), map[token])
  }

  return out
}

export default formatTimestamp
